package com.zhang.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * \* Created with IntelliJ IDEA.
 * \* @author: xiyue
 * \* Date: 2020/6/3
 * \* Time: 14:53
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class ZipUtils {


    public static void zipDir(String directoryName, ZipOutputStream zos, String basePath) {

        /**
         * 该方法递归实现将多个文件夹压缩在同一个zip包中 然后删除文件夹directoryName 下需要被压缩的文件。
         * @param directoryName 文件夹路径
         * @param zos           压缩流 ZipOutputStream 确定压缩包生成的位置
         * @param basePath      用于传给 ZipEntry 用于压缩包分文件夹第一级传入可以为""
         * @throws IOException
         */

        File file = new File(directoryName);
        // 每一级别的递归 basePath 不应该被改变所以添加一个 参数 copyBasePath
        String copyBasePath ="";
        if (file.exists()) {
            File[] fileList = file.listFiles();
            for (File f : fileList) {
                if (f.isDirectory()) {
                    // 拼接文件夹目录
                    if (!"".equals(basePath)) {
                        copyBasePath = basePath+ File.separator+f.getName();
                    } else {
                        copyBasePath = f.getName();
                    }
                    // 继续递归文件夹
                    zipDir(directoryName + File.separator + f.getName(), zos, copyBasePath);
                    //这里是生成空文件夹，加个斜杠/就行了
                    try {
                        zos.putNextEntry(new ZipEntry(copyBasePath+"/"));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        zos.closeEntry();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    // 压缩单个文件到 zos
                    String zipName;
                    if (!"".equals(basePath)) {
                        zipName = basePath + File.separator + f.getName();
                    } else {
                        zipName = f.getName();
                    }
                    try {
                        // zos.putNextEntry  开始添加压缩文件  ZipEntry传入的参数 zipName如果包含了层级关系就会生成文件夹
                        zos.putNextEntry(new ZipEntry(zipName));
                        int len;
                        FileInputStream is = new FileInputStream(f);
                        byte[] bytes = new byte[1024];
                        while ((len = is.read(bytes)) != -1) {
                            zos.write(bytes, 0, len);
                        }
                        zos.flush();
                        // zos.closeEntry()   结束当前压缩文件的添加
                        zos.closeEntry();
                        is.close();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        }
    }

}
